#pragma once

#include <string>
#include <log4cpp/Category.hh>
#include <log4cpp/CategoryStream.hh> // 引入 CategoryStream 以支持流式日志

// ❗ 警告：如果之前的宏命名冲突仍然存在，请在所有 .cpp 文件编译时添加 -DLOG4CPP_FIX_PRIORITY_NAMES
// 在这种情况下，我们假设宏冲突已被构建系统解决，并使用标准优先级名称。

class LogUtils {
public:
    // 1. 公开的静态方法：获取唯一的单例实例
    static LogUtils& getInstance();

    // 2. 核心功能：提供对 Log4cpp Category 的访问
    log4cpp::Category& getRootLogger();

private:
    // 构造函数私有化：阻止外部创建
    LogUtils();
    // 禁用拷贝和赋值：确保唯一性
    ~LogUtils() = default;
    LogUtils(const LogUtils&) = delete;
    LogUtils& operator=(const LogUtils&) = delete;

private:
    // Log4cpp 的根 Logger
    log4cpp::Category& m_root;
};

// 日志宏：支持流式输出 (<<)
// 示例用法：LOG_INFO("Document processed, ID: " << docId << " at pos: " << startPos);

#define LOG_DEBUG LogUtils::getInstance().getRootLogger() << log4cpp::Priority::DEBUG
#define LOG_INFO  LogUtils::getInstance().getRootLogger() << log4cpp::Priority::INFO
#define LOG_WARN  LogUtils::getInstance().getRootLogger() << log4cpp::Priority::WARN
#define LOG_ERROR LogUtils::getInstance().getRootLogger() << log4cpp::Priority::ERROR
#define LOG_FATAL LogUtils::getInstance().getRootLogger() << log4cpp::Priority::FATAL